﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DevExpress.XtraEditors;

namespace DXW
{
    using SKG;
    using SKG.Extend;

    using WS.Bussiness;

    public partial class FrmUngvien : DXW.FrmInput
    {
        BussinessSoapClient _bllUngvien = new BussinessSoapClient();

        Guid Id = Guid.Empty;
        string TabActive = "tabThongtinCanhan";
        DataTable dtChuyenmon;
        DataTable dtHuanluyen;

        public FrmUngvien()
        {
            InitializeComponent();
            _bllCat = new WS.Catalog.CatalogSoapClient();
            _bllBus = new WS.Bussiness.BussinessSoapClient();
        }


        #region CreateDataTable
        private DataTable dtUngvien()
        {
            return _bllUngvien.Ungvien_Select();
        }

        private DataTable dtChuyenmon_Ungvien(Guid Id)
        {
            return _bllBus.Chuyenmon_Select_By_Ungvien(Id);
        }

        private DataTable dtHuanluyen_Ungvien(Guid Id)
        {
            return _bllBus.Huanluyen_Select_By_Ungvien(Id);
        }

        private DataTable dtVitri()
        {
            return _bllCat.Danhmuc_Select_Loai("Vitri");
        }

        private DataTable dtNoicap()
        {
            return _bllCat.Danhmuc_Select_Loai("Noicap");
        }

        private DataTable dtQuoctich()
        {
            return _bllCat.Danhmuc_Select_Loai("Quoctich");
        }

        private DataTable dtTruong()
        {
            return _bllCat.Danhmuc_Select_Loai("Truong");
        }

        private DataTable dtChuyennganh()
        {
            return _bllCat.Danhmuc_Select_Loai("Chuyennganh");
        }

        private DataTable dtBangcap()
        {
            return _bllCat.Danhmuc_Select_Loai("Bangcap");
        }

        private DataTable dtChungchi()
        {
            return _bllCat.Danhmuc_Select_Loai("Chungchi");
        }

        private DataTable CreateNewDataTableUngvien()
        {
            DataTable dt1 = dtUngvien();
            DataTable dt2 = dtVitri();
            DataTable dt3 = dtNoicap();
            DataTable dt4 = dtQuoctich();
            dt1.Columns.Add("Vitri");
            dt1.Columns.Add("Noicap");
            dt1.Columns.Add("Quoctich");

            for (int i = 0; i < dt1.Rows.Count; i++)
            {
                string VitriId = dt1.Rows[i]["Vitri_Id"].ToString();
                for (int j = 0; j < dt2.Rows.Count; j++)
                {
                    if (VitriId == dt2.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Vitri"] = dt2.Rows[j]["Ten"];
                        break;
                    }
                }

                string NoicapId = dt1.Rows[i]["Noicap_Id"].ToString();
                for (int j = 0; j < dt3.Rows.Count; j++)
                {
                    if (NoicapId == dt3.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Noicap"] = dt3.Rows[j]["Ten"];
                        break;
                    }
                }

                string QuoctichId = dt1.Rows[i]["Quoctich_Id"].ToString();
                for (int j = 0; j < dt4.Rows.Count; j++)
                {
                    if (QuoctichId == dt4.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Quoctich"] = dt4.Rows[j]["Ten"];
                        break;
                    }
                }
            }
            return dt1;
        }

        private DataTable CreateNewDataTableChuyenmon_Ungvien(Guid Id)
        {
            DataTable dt1 = dtChuyenmon_Ungvien(Id);
            DataTable dt2 = dtTruong();
            DataTable dt3 = dtChuyennganh();
            DataTable dt4 = dtBangcap();
            dt1.Columns.Add("Truong");
            dt1.Columns.Add("Chuyennganh");
            dt1.Columns.Add("Bangcap");

            for (int i = 0; i < dt1.Rows.Count; i++)
            {
                string TruongId = dt1.Rows[i]["Truong_Id"].ToString();
                for (int j = 0; j < dt2.Rows.Count; j++)
                {
                    if (TruongId == dt2.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Truong"] = dt2.Rows[j]["Ten"];
                        break;
                    }
                }

                string ChuyennganhId = dt1.Rows[i]["Chuyennganh_Id"].ToString();
                for (int j = 0; j < dt3.Rows.Count; j++)
                {
                    if (ChuyennganhId == dt3.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Chuyennganh"] = dt3.Rows[j]["Ten"];
                        break;
                    }
                }

                string BangcapId = dt1.Rows[i]["Bangcap_Id"].ToString();
                for (int j = 0; j < dt4.Rows.Count; j++)
                {
                    if (BangcapId == dt4.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Bangcap"] = dt4.Rows[j]["Ten"];
                        break;
                    }
                }
            }
            return dt1;
        }

        private DataTable CreateNewDataTableHuanluyen_Ungvien(Guid Id)
        {
            DataTable dt1 = dtHuanluyen_Ungvien(Id);
            DataTable dt2 = dtBangcap();
            dt1.Columns.Add("Bangcap");

            for (int i = 0; i < dt1.Rows.Count; i++)
            {
                string BangcapId = dt1.Rows[i]["Bangcap_Id"].ToString();
                for (int j = 0; j < dt2.Rows.Count; j++)
                {
                    if (BangcapId == dt2.Rows[j]["Id"].ToString())
                    {
                        dt1.Rows[i]["Bangcap"] = dt2.Rows[j]["Ten"];
                        break;
                    }
                }
            }
            return dt1;
        }
        #endregion

        #region LoadDataToLookup
        private void LoadDsDanhmuc()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    LoadDsDanhmuc_Chuyenmon();
                    break;
                case "tabHuanluyen":
                    LoadDsDanhmuc_Huanluyen();
                    break;
                default:
                    break;
            }
        }

        private void LoadDsDanhmuc_Huanluyen()
        {
            DataTable dtDsChungchi = dtChungchi();
            dtDsChungchi.Columns[3].ColumnName = "Chungchi";
            lokTruong.Properties.DataSource = dtDsChungchi;
            lokTruong.Properties.DisplayMember = "Chungchi";
            lokTruong.Properties.ValueMember = "Id";
        }

        private void LoadDsDanhmuc_Chuyenmon()
        {
            DataTable dtDsTruong = dtTruong();
            dtDsTruong.Columns[3].ColumnName = "Truong";
            lokTruong.Properties.DataSource = dtDsTruong;
            lokTruong.Properties.DisplayMember = "Truong";
            lokTruong.Properties.ValueMember = "Id";

            DataTable dtDsChuyengnganh = dtChuyennganh();
            dtDsChuyengnganh.Columns[3].ColumnName = "Chuyennganh";
            lokChuyennganh.Properties.DataSource = dtDsChuyengnganh;
            lokChuyennganh.Properties.DisplayMember = "Chuyennganh";
            lokChuyennganh.Properties.ValueMember = "Id";

            DataTable dtDsBangcap = dtBangcap();
            dtDsBangcap.Columns[3].ColumnName = "Bangcap";
            lokBangcap.Properties.DataSource = dtDsBangcap;
            lokBangcap.Properties.DisplayMember = "Bangcap";
            lokBangcap.Properties.ValueMember = "Id";
        }

        private void LoadDsDanhmuc_Ungvien()
        {
            DataTable dtDsVitri = dtVitri();
            dtDsVitri.Columns[3].ColumnName = "Vitri";
            lokVitri.Properties.DataSource = dtDsVitri;
            lokVitri.Properties.DisplayMember = "Vitri";
            lokVitri.Properties.ValueMember = "Id";

            DataTable dtDsNoicap = dtNoicap();
            dtDsNoicap.Columns[3].ColumnName = "Noicap";
            lokNoicap.Properties.DataSource = dtDsNoicap;
            lokNoicap.Properties.DisplayMember = "Noicap";
            lokNoicap.Properties.ValueMember = "Id";

            DataTable dtDsQuoctich = dtQuoctich();
            dtDsQuoctich.Columns[3].ColumnName = "Quoctich";
            lokQuoctich.Properties.DataSource = dtDsQuoctich;
            lokQuoctich.Properties.DisplayMember = "Quoctich";
            lokQuoctich.Properties.ValueMember = "Id";
        }
        #endregion

        #region LoadData OKI
        protected override void LoadData()
        {
            ResetInput();

            switch (TabActive)
            {
                case "tabChuyenmon":
                    LoadData_Chuyenmon();
                    break;
                case "tabHuanluyen":
                    LoadData_Huanluyen();
                    break;
                default:
                    LoadData_Ungvien();
                    break;
            }
            base.LoadData();
        }

        private void LoadData_Huanluyen()
        {
            ClearDataBindings_Huanluyen();
            dtHuanluyen = CreateNewDataTableHuanluyen_Ungvien(Id);
            if (dtHuanluyen.Rows.Count > 0)
            {
                gcHuanluyen.DataSource = dtHuanluyen;
                DataBinding_Huanluyen();
            }
            else gcHuanluyen.DataSource = null;
        }

        private void LoadData_Chuyenmon()
        {
            ClearDataBindings_Chuyenmon();
            dtChuyenmon = CreateNewDataTableChuyenmon_Ungvien(Id);
            if (dtChuyenmon.Rows.Count > 0)
            {
                gcChuyenmon.DataSource = dtChuyenmon;
                DataBinding_Chuyenmon();
            }
            else gcChuyenmon.DataSource = null;
        }

        private void LoadData_Ungvien()
        {
            ClearDataBindings_Ungvien();
            _dtb = CreateNewDataTableUngvien();
            if (_dtb.Rows.Count > 0)
            {
                gcUngvien.DataSource = _dtb;
                DataBinding_Ungvien();
            }
            else gcUngvien.DataSource = null;
        }
        #endregion

        private void gvUngvien_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
        {
            try
            {
                Id = (Guid)gvUngvien.GetFocusedRowCellValue("Id");
                if (Id != Guid.Empty)
                {
                    if (TabActive != "tabThongtinCanhan") { LoadDsDanhmuc(); LoadData(); }
                }
                else
                {
                    ResetInput();
                    ClearDataBindings();
                    switch (TabActive)
                    {
                        case "tabChuyenmon":
                            gcChuyenmon.DataSource = null;
                            break;
                        case "tabHuanluyen":
                            gcHuanluyen.DataSource = null;
                            break;
                        default: //ko mần gì hớt, vì gvUngvien là gv cha
                            break;
                    }
                }
            }
            catch (Exception)
            {
            }
        }

        #region PerformRefresh OKI
        protected override void PerformRefresh()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    PerformRefresh_Chuyenmon();
                    break;
                case "tabHuanluyen":
                    PerformRefresh_Huanluyen();
                    break;
                default:
                    PerformRefresh_Ungvien();
                    break;
            }

            ReadOnlyControl(); //Dùng chung => bên trong nó switch cho từng tab

            base.PerformRefresh();
        }

        private void PerformRefresh_Huanluyen()
        {
            LoadDsDanhmuc_Huanluyen();
            LoadData_Huanluyen();
        }

        private void PerformRefresh_Chuyenmon()
        {
            LoadDsDanhmuc_Chuyenmon();
            LoadData_Chuyenmon();
        }

        private void PerformRefresh_Ungvien()
        {
            LoadDsDanhmuc_Ungvien();
            LoadData_Ungvien();
        }
        #endregion

        #region Add   Test lại có nên chia ko
        protected override void PerformAdd()
        {

            base.PerformAdd();

            txtMa.Text = _bllUngvien.Ungvien_Layma();
        }

        #endregion

        #region Edit OKI, khỏi chia, all in one
        protected override void PerformEdit()
        {
            if (Id == Guid.Empty)
            {
                XtraMessageBox.Show(STR_CHOICE_E,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            base.PerformEdit();
        }
        #endregion

        #region PerformDelete OKI
        protected override void PerformDelete()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    Delete_Chuyenmon();
                    break;
                case "tabHuanluyen":
                    Delete_Huanluyen();
                    break;
                default:
                    Delete_Ungvien();
                    break;
            }

            base.PerformDelete();
        }

        private void Delete_Huanluyen()
        {
            var tmpId = gvHuanluyen.GetFocusedRowCellValue("Id");
            if (tmpId == null)
            {
                XtraMessageBox.Show(STR_CHOICE,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            var text = gvHuanluyen.GetFocusedRowCellValue("Chungchi");
            var id = (Guid)tmpId;

            if (id == new Guid())
                XtraMessageBox.Show(STR_SELECT.ToUpper(), STR_DELETE.ToUpper(),MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
            {
                var cfm = String.Format(STR_CONFIRM, text);
                var oki = XtraMessageBox.Show(cfm.ToUpper(), STR_DELETE.ToUpper(), MessageBoxButtons.OKCancel);

                if (oki == DialogResult.OK)
                    if (_bllBus.Huanluyen_Delete(id) != null)
                        PerformRefresh();
                    else XtraMessageBox.Show(STR_UNDELETE.ToUpper(), STR_DELETE.ToUpper(),MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void Delete_Chuyenmon()
        {
            var tmpId = gvChuyenmon.GetFocusedRowCellValue("Id");
            if (tmpId == null)
            {
                XtraMessageBox.Show(STR_CHOICE,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            var text = gvChuyenmon.GetFocusedRowCellValue("Bangcap");
            var id = (Guid)tmpId;

            if (id == new Guid())
                XtraMessageBox.Show(STR_SELECT.ToUpper(), STR_DELETE.ToUpper(),
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
            {
                var cfm = String.Format(STR_CONFIRM, text);
                var oki = XtraMessageBox.Show(cfm.ToUpper(), STR_DELETE.ToUpper(), MessageBoxButtons.OKCancel);

                if (oki == DialogResult.OK)
                    if (_bllBus.Chuyenmon_Delete(id) != null) PerformRefresh();
                    else XtraMessageBox.Show(STR_UNDELETE.ToUpper(), STR_DELETE.ToUpper(),
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void Delete_Ungvien()
        {
            var tmpId = gvUngvien.GetFocusedRowCellValue("Id");
            if (tmpId == null)
            {
                XtraMessageBox.Show(STR_CHOICE,
                    Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            var text = gvUngvien.GetFocusedRowCellValue("Ten");
            var id = (Guid)tmpId;

            if (id == new Guid())
                XtraMessageBox.Show(STR_SELECT.ToUpper(), STR_DELETE.ToUpper(),
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
            {
                var cfm = String.Format(STR_CONFIRM, text);
                var oki = XtraMessageBox.Show(cfm.ToUpper(), STR_DELETE.ToUpper(), MessageBoxButtons.OKCancel);

                if (oki == DialogResult.OK)
                    if (_bllUngvien.Ungvien_Delete(id) != null) PerformRefresh();
                    else XtraMessageBox.Show(STR_UNDELETE.ToUpper(), STR_DELETE.ToUpper(),
                        MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        #endregion

        #region PerformSave OKI
        protected override void PerformSave()
        {
            switch (_state)
            {
                case State.Add:
                    if (InsertObject()) //Switch cho từng tab
                    {
                        XtraMessageBox.Show("Lưu thành công!", "Lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    break;

                case State.Edit:
                    if (UpdateObject()) //Switch cho từng tab
                    {
                        XtraMessageBox.Show("Lưu thành công!", "Lưu", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                    break;

                default:
                    break;
            }
            base.PerformSave();
        }
        #endregion

        #region UpdateObject OKI

        protected override bool UpdateObject()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    if (!ValidInput_Chuyenmon())
                    {
                        XtraMessageBox.Show("Cần nhập thông tin chuyên môn chính xác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                    return UpdateObject_Chuyenmon();
                case "tabHuanluyen":
                    if (!ValidInput_Huanluyen())
                    {
                        XtraMessageBox.Show("Cần nhập thông tin khóa huấn luyện chính xác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                    return UpdateObject_Huanluyen();
                default:
                    if (!ValidInput_Ungvien())
                    {
                        XtraMessageBox.Show("Cần nhập thông tin ứng viên chính xác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                    return UpdateObject_Ungvien();
            }
        }

        private bool UpdateObject_Huanluyen()
        {
            try
            {
                // Sữa
                var o = new WS.Bussiness.Huanluyen()
                {
                    Id = gvHuanluyen.GetFocusedRowCellValue("ID").GetGuid(),
                    Doivi = txtDonvi.Text.ToUpperWords(),
                    Ten_Khoahoc = txtTen_Khoahoc.Text.ToUpperFirst(),
                    Thoigian = txtThoigian_Huanluyen.Text.ToUpperFirst(),
                    Chungchi_Id = lokChungchi.GetColumnValue("Chungchi").GetGuid()
                };
                _bllBus.Huanluyen_Update(o);
                //Xử lý sau khi sữa xong
                ChangeStatus();
                ReadOnlyControl();
                LoadData();
                return true;
            }
            catch { return false; }
        }

        private bool UpdateObject_Chuyenmon()
        {
            try
            {
                //Sữa
                var o = new WS.Bussiness.Chuyenmon()
                {
                    Id = gvChuyenmon.GetFocusedRowCellValue("Id").GetGuid(),
                    Truong_Id = lokTruong.GetColumnValue("Id").GetGuid(),
                    Chuyennganh_Id = lokChuyennganh.GetColumnValue("Id").GetGuid(),
                    Thoigian = txtThoigian.Text,
                    Bangcap_Id = lokBangcap.GetColumnValue("Id").GetGuid()
                };
                _bllBus.Chuyenmon_Update(o);
                //Xử lý sau khi sữa xong
                ChangeStatus();
                ReadOnlyControl();
                LoadData();
                return true;
            }
            catch { return false; }
        }

        private bool UpdateObject_Ungvien()
        {
            try
            {
                var o = new WS.Bussiness.Ungvien()
                {
                    Id = gvUngvien.GetFocusedRowCellValue("Id").GetGuid(),
                    Ma = gvUngvien.GetFocusedRowCellValue("Ma").ToString(),
                    Vitri_Id = lokVitri.GetColumnValue("Id").GetGuid(),
                    Mucluong = caltMucluong.Text.ToInt64(),
                    Ngay_Lamviec = dtpNgay_Lamviec.DateTime,
                    Muctieu = txtMuctieu.Text.ToUpperFirst(),
                    Ten = txtTen.Text.ToUpperWords(),
                    Ngaysinh = dtpNgaysinh.DateTime,
                    Noisinh = txtNoisinh.Text.ToUpperWords(),
                    Gioitinh = radGioitinh.EditValue.ToBoolean(),
                    CMND = txtCMND.Text,
                    Ngaycap = dtpNgaycap.DateTime,
                    Noicap_Id = lokNoicap.GetColumnValue("Id").GetGuid(),
                    Quoctich_Id = lokQuoctich.GetColumnValue("Id").GetGuid(),
                    Diachi_Thuongtru = txtDiachi_Thuongtru.Text.ToUpperWords(),
                    Diachi_Lienhe = txtDiachi_lienhe.Text.ToUpperWords(),
                    Tel = txtTel.Text,
                    HP = txtHP.Text,
                    Email = txtEmail.Text,

                    Chieucao = calChieucao.Value,
                    Cannang = calCannang.Value,

                    Honnhan = radHonnhan.EditValue.ToString(),
                    Sothich = meoSothich.Text.ToUpperFirst(),
                    Diemmanh = meoDiemmanh.Text.ToUpperFirst(),
                    Diemyeu = meoDiemyeu.Text.ToUpperFirst(),
                    Muctieu2 = null,
                    Cacbuoc = null,
                    Nhanviec = null,
                    Lamviec = null,
                    Khong_Hailong = null,
                    Ba_Yeuto_Mongmuon = null,
                    Lydo_Nopdon_Xinviec = null,
                    Biet_Thongtin = null
                };
                _bllUngvien.Ungvien_Update(o);
                //Sử lý sau khi cập nhật ===> ko thể gọp chung khúc này vô UpdateObject :(
                ChangeStatus();
                ReadOnlyControl();
                LoadData();
                return true;
            }
            catch { return false; }
        }
        #endregion

        #region InsertObject OKI
        protected override bool InsertObject()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    if (!ValidInput_Chuyenmon()) //switch rồi thì có thể gọi ValidInput trực tiếp của Chuyenmon luôn
                    {
                        XtraMessageBox.Show("Cần nhập thông tin chuyên môn chính xác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                    return InsertObject_Chuyenmon();
                case "tabHuanluyen":
                    if (!ValidInput_Huanluyen()) //switch rồi thì có thể gọi ValidInput trực tiếp của Chuyenmon luôn
                    {
                        XtraMessageBox.Show("Cần nhập thông tin khóa huấn luyện chính xác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                    return InsertObject_Huanluyen();
                default:
                    if (!ValidInput_Ungvien()) //switch rồi thì có thể gọi ValidInput trực tiếp của Ungvien luôn
                    {
                        XtraMessageBox.Show("Cần nhập thông tin ứng viên chính xác", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return false;
                    }
                    return InsertObject_Ungvien();
            }
        }

        private bool InsertObject_Huanluyen()
        {
            try
            {
                var o = new WS.Bussiness.Huanluyen()
                {
                    Id = gvHuanluyen.GetFocusedRowCellValue("ID").GetGuid(),
                    Ungvien_Id=Id,
                    Doivi = txtDonvi.Text.ToUpperWords(),
                    Ten_Khoahoc = txtTen_Khoahoc.Text.ToUpperFirst(),
                    Thoigian = txtThoigian_Huanluyen.Text.ToUpperFirst(),
                    Chungchi_Id = lokChungchi.GetColumnValue("Chungchi").GetGuid()
                };

                _bllBus.Huanluyen_Insert(o);
                //Sử lý sau khi insert
                LoadData();
                ResetInput();
                return true;
            }
            catch { return false; }
        }

        private bool InsertObject_Chuyenmon()
        {
            try
            {
                var o = new WS.Bussiness.Chuyenmon();
                o.Id = Guid.NewGuid();
                o.Ungvien_Id = Id;
                o.Truong_Id = (Guid)lokTruong.GetColumnValue("Id");
                o.Chuyennganh_Id = (Guid)lokChuyennganh.GetColumnValue("Id");
                o.Thoigian = txtThoigian.Text;
                o.Bangcap_Id = (Guid)lokBangcap.GetColumnValue("Id");

                _bllBus.Chuyenmon_Insert(o);
                //Sử lý sau khi insert
                LoadData();
                ResetInput();
                return true;
            }
            catch { return false; }
        }

        private bool InsertObject_Ungvien()
        {
            try
            {
                var o = new WS.Bussiness.Ungvien();
                o.Id = Guid.NewGuid();
                o.Ma = txtMa.Text;
                o.Vitri_Id = lokVitri.GetColumnValue("Id").GetGuid();
                o.Mucluong = caltMucluong.EditValue.ToDecimal();
                o.Ngay_Lamviec = dtpNgay_Lamviec.DateTime;
                o.Muctieu = txtMuctieu.Text;
                o.Ten = txtTen.Text;
                o.Ngaysinh = dtpNgaysinh.DateTime;
                o.Noisinh = txtNoisinh.Text;
                o.Gioitinh = radGioitinh.EditValue.ToBoolean();
                o.CMND = txtCMND.Text;
                o.Ngaycap = dtpNgaycap.DateTime;
                o.Noicap_Id = lokNoicap.GetColumnValue("Id").GetGuid();
                o.Quoctich_Id = lokQuoctich.GetColumnValue("Id").GetGuid();
                o.Diachi_Thuongtru = txtDiachi_Thuongtru.Text;
                o.Diachi_Lienhe = txtDiachi_lienhe.Text;
                o.Tel = txtTel.Text;
                o.HP = txtHP.Text;
                o.Email = txtEmail.Text;
                o.Chieucao = calChieucao.Value;
                o.Cannang = calCannang.Value;
                o.Honnhan = radHonnhan.EditValue.ToText();
                o.Sothich = meoSothich.Text;
                o.Diemmanh = meoDiemmanh.Text;
                o.Diemyeu = meoDiemyeu.Text;
                o.Muctieu2 = null;
                o.Cacbuoc = null;
                o.Nhanviec = null;
                o.Lamviec = null;
                o.Khong_Hailong = null;
                o.Ba_Yeuto_Mongmuon = null;
                o.Lydo_Nopdon_Xinviec = null;
                o.Biet_Thongtin = null;

                _bllUngvien.Ungvien_Insert(o);
                //Sử lý sau khi chuyện đã rồi ^^
                LoadData();
                ResetInput();
                txtMa.Text = _bllBus.Ungvien_Layma();
                return true;
            }
            catch { return false; }
        }
        #endregion

        #region ClearDataBindings OKI
        protected override void ClearDataBindings()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    ClearDataBindings_Chuyenmon();
                    break;
                case "tabHuanluyen":
                    ClearDataBindings_Huanluyen();
                    break;
                default:
                    ClearDataBindings_Ungvien();
                    break;
            }
            base.ClearDataBindings();
        }

        private void ClearDataBindings_Huanluyen()
        {
            txtDonvi.DataBindings.Clear();
            txtTen_Khoahoc.DataBindings.Clear();
            txtThoigian_Huanluyen.DataBindings.Clear();
            lokChungchi.DataBindings.Clear();
        }

        private void ClearDataBindings_Chuyenmon()
        {
            lokTruong.DataBindings.Clear();
            lokChuyennganh.DataBindings.Clear();
            txtThoigian.DataBindings.Clear();
            lokBangcap.DataBindings.Clear();
        }

        private void ClearDataBindings_Ungvien()
        {
            txtMa.DataBindings.Clear();
            lokVitri.DataBindings.Clear();
            caltMucluong.DataBindings.Clear();
            dtpNgay_Lamviec.DataBindings.Clear();
            txtMuctieu.DataBindings.Clear();
            txtTen.DataBindings.Clear();
            dtpNgaysinh.DataBindings.Clear();
            txtNoisinh.DataBindings.Clear();

            radGioitinh.DataBindings.Clear();

            txtCMND.DataBindings.Clear();
            dtpNgaycap.DataBindings.Clear();
            lokNoicap.DataBindings.Clear();
            lokQuoctich.DataBindings.Clear();
            txtDiachi_lienhe.DataBindings.Clear();
            txtDiachi_Thuongtru.DataBindings.Clear();
            txtTel.DataBindings.Clear();
            txtHP.DataBindings.Clear();
            txtEmail.DataBindings.Clear();
            calChieucao.DataBindings.Clear();
            calCannang.DataBindings.Clear();
            radHonnhan.DataBindings.Clear();
            meoSothich.DataBindings.Clear();
            meoDiemmanh.DataBindings.Clear();
            meoDiemyeu.DataBindings.Clear();
        }
        #endregion

        #region DataBindingControl OKI
        protected override void DataBindingControl()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    DataBinding_Chuyenmon();
                    break;
                default:
                    DataBinding_Ungvien();
                    break;
            }
            base.DataBindingControl();
        }

        private void DataBinding_Huanluyen()
        {
            txtDonvi.DataBindings.Add("EditValue", dtHuanluyen, ".Donvi");
            txtTen_Khoahoc.DataBindings.Add("EditValue", dtHuanluyen, ".Ten_Khoahoc");
            txtThoigian_Huanluyen.DataBindings.Add("EditValue", dtHuanluyen, ".Thoigian");
            lokChungchi.DataBindings.Add("EditValue", dtHuanluyen, ".Chungchi");
        }

        private void DataBinding_Chuyenmon()
        {
            lokTruong.DataBindings.Add("EditValue", dtChuyenmon, ".Truong_Id");
            lokChuyennganh.DataBindings.Add("EditValue", dtChuyenmon, ".Chuyennganh_Id");
            txtThoigian.DataBindings.Add("EditValue", dtChuyenmon, ".Thoigian");
            lokBangcap.DataBindings.Add("EditValue", dtChuyenmon, ".Bangcap_Id");
        }

        private void DataBinding_Ungvien()
        {
            txtMa.DataBindings.Add("EditValue", _dtb, ".Ma");

            lokVitri.DataBindings.Add("EditValue", _dtb, ".Vitri_Id");

            caltMucluong.DataBindings.Add("EditValue", _dtb, ".Mucluong");
            dtpNgay_Lamviec.DataBindings.Add("EditValue", _dtb, ".Ngay_Lamviec");
            txtMuctieu.DataBindings.Add("EditValue", _dtb, ".Muctieu");
            txtTen.DataBindings.Add("EditValue", _dtb, ".Ten");
            dtpNgaysinh.DataBindings.Add("EditValue", _dtb, ".Ngaysinh");
            txtNoisinh.DataBindings.Add("EditValue", _dtb, ".Noisinh");

            txtCMND.DataBindings.Add("EditValue", _dtb, ".CMND");
            dtpNgaycap.DataBindings.Add("EditValue", _dtb, ".Ngaycap");

            lokNoicap.DataBindings.Add("EditValue", _dtb, ".Noicap_Id");
            lokQuoctich.DataBindings.Add("EditValue", _dtb, ".Quoctich_Id");

            txtDiachi_lienhe.DataBindings.Add("EditValue", _dtb, ".Diachi_lienhe");
            txtDiachi_Thuongtru.DataBindings.Add("EditValue", _dtb, ".Diachi_Thuongtru");
            txtTel.DataBindings.Add("EditValue", _dtb, ".Tel");
            txtHP.DataBindings.Add("EditValue", _dtb, ".HP");
            txtEmail.DataBindings.Add("EditValue", _dtb, ".Email");
            calChieucao.DataBindings.Add("EditValue", _dtb, ".Chieucao");
            calCannang.DataBindings.Add("EditValue", _dtb, ".Cannang");

            meoSothich.DataBindings.Add("EditValue", _dtb, ".Sothich");
            meoDiemmanh.DataBindings.Add("EditValue", _dtb, ".Diemmanh");
            meoDiemyeu.DataBindings.Add("EditValue", _dtb, ".Diemyeu");

            radHonnhan.DataBindings.Add("EditValue", _dtb, ".Honnhan");
            radGioitinh.DataBindings.Add("EditValue", _dtb, ".Gioitinh");
        }
        #endregion

        #region ResetInput OKI
        /// <summary>
        /// Xóa trống dữ liệu trên controls
        /// </summary>
        protected override void ResetInput()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    ResetInput_Chuyenmon();
                    break;
                default:
                    ResetInput_Ungvien();
                    break;
            }
            base.ResetInput();
        }

        private void ResetInput_Ungvien()
        {
            lokVitri.EditValue = null;
            caltMucluong.EditValue = null;
            dtpNgay_Lamviec.Text = null;
            txtMuctieu.Text = null;
            txtTen.Text = null;
            dtpNgaysinh.Text = null;
            txtNoisinh.Text = null;
            radGioitinh.SelectedIndex = 0;
            radHonnhan.SelectedIndex = 0;
            txtCMND.Text = null;
            dtpNgaycap.Text = null;
            lokNoicap.EditValue = null;
            lokQuoctich.EditValue = null;
            txtDiachi_lienhe.Text = null;
            txtDiachi_Thuongtru.Text = null;
            txtTel.Text = null;
            txtHP.Text = null;
            txtEmail.Text = null;

            calChieucao.EditValue = 158;
            calCannang.EditValue = 30;

            meoSothich.Text = null;
            meoDiemmanh.Text = null;
            meoDiemyeu.Text = null;
        }

        private void ResetInput_Chuyenmon() //chú ý các loại control khác nhau thì null lấy khác nữa híc
        {
            lokTruong.EditValue = null;
            lokChuyennganh.EditValue = null;
            txtThoigian.Text = null;
            lokBangcap.EditValue = null;
        }
        #endregion

        #region ReadonlyControl OKI
        /// <summary>
        /// Set properties control is readonly
        /// </summary>
        /// <param name="isReadOnly"></param>
        protected override void ReadOnlyControl(bool isReadOnly = true)
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    ReadOnlyControl_Chuyenmon(isReadOnly);
                    break;
                case "tabHuanluyen":
                    ReadOnlyControl_Huanluyen(isReadOnly);
                    break;
                default:
                    ReadOnlyControl_Ungvien(isReadOnly);
                    break;
            }
            
            base.ReadOnlyControl(isReadOnly);
        }

        private void ReadOnlyControl_Huanluyen(bool isReadOnly = true)
        {
            txtDonvi.Properties.ReadOnly = isReadOnly;
            txtTen_Khoahoc.Properties.ReadOnly = isReadOnly;
            txtThoigian_Huanluyen.Properties.ReadOnly = isReadOnly;
            lokChungchi.Properties.ReadOnly = isReadOnly;

            gcHuanluyen.Enabled = isReadOnly;
        }

        private void ReadOnlyControl_Chuyenmon(bool isReadOnly = true)
        {
            lokTruong.Properties.ReadOnly = isReadOnly;
            lokChuyennganh.Properties.ReadOnly = isReadOnly;
            txtThoigian.Properties.ReadOnly = isReadOnly;
            lokBangcap.Properties.ReadOnly = isReadOnly;

            gcChuyenmon.Enabled = isReadOnly;
        }

        private void ReadOnlyControl_Ungvien(bool isReadOnly = true)
        {
            lokVitri.Properties.ReadOnly = isReadOnly;
            caltMucluong.Properties.ReadOnly = isReadOnly;
            dtpNgay_Lamviec.Properties.ReadOnly = isReadOnly;
            txtMuctieu.Properties.ReadOnly = isReadOnly;
            txtTen.Properties.ReadOnly = isReadOnly;
            dtpNgaysinh.Properties.ReadOnly = isReadOnly;
            txtNoisinh.Properties.ReadOnly = isReadOnly;

            radGioitinh.Properties.ReadOnly = isReadOnly;

            txtCMND.Properties.ReadOnly = isReadOnly;
            dtpNgaycap.Properties.ReadOnly = isReadOnly;
            lokNoicap.Properties.ReadOnly = isReadOnly;
            lokQuoctich.Properties.ReadOnly = isReadOnly;
            txtDiachi_lienhe.Properties.ReadOnly = isReadOnly;
            txtDiachi_Thuongtru.Properties.ReadOnly = isReadOnly;
            txtTel.Properties.ReadOnly = isReadOnly;
            txtHP.Properties.ReadOnly = isReadOnly;
            txtEmail.Properties.ReadOnly = isReadOnly;
            calChieucao.Properties.ReadOnly = isReadOnly;
            calCannang.Properties.ReadOnly = isReadOnly;

            radHonnhan.Properties.ReadOnly = isReadOnly;

            meoSothich.Properties.ReadOnly = isReadOnly;
            meoDiemmanh.Properties.ReadOnly = isReadOnly;
            meoDiemyeu.Properties.ReadOnly = isReadOnly;

            gcUngvien.Enabled = isReadOnly;
        }
        #endregion

        #region ValidInput OKI
        /// <summary>
        /// Kiểm tra dữ liệu nhập vào => đã có switch cho từng tab
        /// </summary>
        /// <returns></returns>
        protected override bool ValidInput()
        {
            switch (TabActive)
            {
                case "tabChuyenmon":
                    return ValidInput_Chuyenmon();
                case "tabHuanluyen":
                    return ValidInput_Huanluyen();
                default:
                    return ValidInput_Ungvien();
            }
            return base.ValidInput();
        }

        private bool ValidInput_Huanluyen()
        {
            if (txtDonvi.Text == null)
            {
                XtraMessageBox.Show("Chưa nhập đơn vị đào tạo", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (txtTen_Khoahoc.Text == null)
            {
                XtraMessageBox.Show("Chưa nhập tên khóa học", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (txtThoigian_Huanluyen.Text == "")
            {
                XtraMessageBox.Show("Chưa nhập thời gian học của khóa huấn luyện", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (lokChungchi.EditValue == null)
            {
                XtraMessageBox.Show("Chưa chọn chứng chỉ", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        private bool ValidInput_Chuyenmon()
        {
            if (lokTruong.EditValue == null)
            {
                XtraMessageBox.Show("Chưa chọn trường đào tạo", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (lokChuyennganh.EditValue == null)
            {
                XtraMessageBox.Show("Chưa chọn chuyện ngành", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (txtThoigian.Text == "")
            {
                XtraMessageBox.Show("Chưa nhập thời gian đào tạo", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (lokBangcap.EditValue == null)
            {
                XtraMessageBox.Show("Chưa chọn bằng cấp", "Lổi nhập liệu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        private bool ValidInput_Ungvien()
        {
            //Chưa kiểm tra gì hết
            return true;
        }
        #endregion

        #region Constants
        private const string STR_TITLE = "Ứng viên";
        private const string STR_ADD = "Thêm " + STR_TITLE;
        private const string STR_EDIT = "Sửa " + STR_TITLE;
        private const string STR_DELETE = "Xoá " + STR_TITLE;

        private const string STR_SELECT = "Chọn dữ liệu!";
        private const string STR_CONFIRM = "Tất cả dữ liệu liên quan đến ứng viên này sẽ bị xóa hoàn toàn khỏi hệ thống\nCó xoá '{0}' không?";
        private const string STR_UNDELETE = "Không xoá được!\nDữ liệu đang được sử dụng.";
        private const string STR_DUPLICATE = "Vị trí này có rồi";

        //private const string STR_AGE = "Phải 18 tuổi trở lên!";
        //private const string STR_PASS = "Mật khẩu 6 kí tự trở lên!";

        private const string STR_CHOICE = "CHỌN DÒNG CẦN XOÁ\n\rHOẶC KHÔNG ĐƯỢC CHỌN NHÓM ĐỂ XOÁ";
        private const string STR_CHOICE_E = "CHỌN DÒNG CẦN SỬA\n\r HOẶC KHÔNG ĐƯỢC CHỌN NHÓM ĐỂ SỬA";
        #endregion

        private void tabMain_SelectedPageChanged(object sender, DevExpress.XtraTab.TabPageChangedEventArgs e)
        {
            switch (e.Page.Name)
            {
                case "tabChuyenmon":
                    TabActive = "tabChuyenmon";
                    break;
                case "tabKhoaHuanluyen":
                    TabActive = "tabKhoaHuanluyen";
                    break;
                case "tabNgonngu":
                    TabActive = "tabNgonngu";
                    break;
                case "tabVitinh":
                    TabActive = "tabVitinh";
                    break;
                case "tabKinhnghiem":
                    TabActive = "tabKinhnghiem";
                    break;
                case "tabThongtinBosung":
                    TabActive = "tabThongtinBosung";
                    break;
                case "tabThamchieu":
                    TabActive = "tabThamchieu";
                    break;
                default:
                    TabActive = "tabThongtinCanhan";
                    break;
            }
            LoadDsDanhmuc();
            ReadOnlyControl();
            ChangeStatus();
        }
    }
}